/* Shift-JIS */
/* UTF-8 */
/********************************************************************************/
/*ソース名:                                                                     */
/*　　table.h                                                              */
/*機能:                                                                         */
/*　　TODO:ファイルの機能を書く                    　　　　　　　　　　　　　　 */
/*作成者:                                                                       */
/*　　2010-9-15 guanxiaoying（CBS）                                                 */
/********************************************************************************/
/*変更履歴:                                                                     */
/*　2010-9-15　guanxiaoying　　新規作成                                                */
/********************************************************************************/

#ifndef TABLE_H_
#define TABLE_H_

#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <time.h>
#include <errno.h>
#include "typedef.h"
#include "Id.h"
#include "lib_func.h"
#include "encode.h"
#include "core.h"
#include "./textfile/pf_file.h"
#include "./memory/mem_interface.h"
#include "../alert/alert.h"

//#define assert_index( a, b, c ) (VOID)fprintf( stdout, "%s:%ld: max=%d, isOpened= %ld, index = %ld\n", __FILE__, __LINE__, a, b, c )
#define assert_index( a, b, c )
typedef struct _VALUEINFO
{
	AST		astType;
	union {
		S2		sval;
		U2		usval;
		S4		lVal;
		U4		ulVal;
		S8      llval;
		U8      ullval;
		DOUBLE		dbVal;
	} unValue;
} VALUEINFO, *PVALUEINFO;
typedef struct _MEMTABLECTRL
{
	U4                  u4Idx;
	PSZ				    con_pszName;
	U2					con_usSize;		/* ﾃﾝﾎﾟﾗﾘﾃｰﾌﾞﾙｻｲｽﾞ		*/
	U2					block_num;	/* 現在の確保数	block		*/
	S4					astMaxNum_Block;     /* 1Blockで格納できる数 */
	S4					astTabNum_LastPage; /* 最後のページのテーブル数 */
	S4					astMaxNum_LastPage;     /* 最後のページで格納できるテーブル数 */
	U4					ulMaxByte;	/* すべてのバイト */
	U4					con_minPageSize;
	S4 					maxRecordNum;
	VOID*				memoryBlocks[MAX_VOLUMN_OF_TABLE];
} TABLEMANAGER, *PTABLEMANAGER;

typedef struct {
	BOOL (*reg_in)( VOID );
	BOOL (*clear)( VOID );
	BOOL (*reset)( VOID );
	BOOL (*alloc)( AST );
	BOOL (*copy)( AST, AST, AST );
	AST  (*getMax)( VOID );
}ACCESS_PROCESS;
typedef struct {
	/*    get method */
	BOOL  (*get)( AST );
	/*    set method */
	BOOL  (*set)( AST , BOOL  );
}ACCESS_BOOL_FIELD;
typedef struct {
	/*    get method */
	AST  (*get)( AST );
	/*    set method */
	AST  (*set)( AST , AST  );
}ACCESS_IDX_FIELD;
typedef struct {
	/*    get method */
	CHAR* (*get)( AST );
	/*    set method */
	AST  (*set)( AST , CHAR *  );
}ACCESS_STR_FIELD;
typedef struct {
	AST  (*append)( AST , CHAR *  );
}ACCESS_STR_FIELD2;
typedef struct {
	/*    get method */
	S4  (*get)( AST );
	/*    set method */
	S4  (*set)( AST , S4  );
}ACCESS_S4_FIELD;
typedef struct {
	/*    get method */
	U4  (*get)( AST );
	/*    set method */
	U4  (*set)( AST , U4  );
}ACCESS_U4_FIELD;
typedef struct {
	/*    get method */
	U2  (*get)( AST );
	/*    set method */
	U2  (*set)( AST , U2  );
}ACCESS_U2_FIELD;
typedef struct {
	/*    get method */
	S2  (*get)( AST );
	/*    set method */
	S2  (*set)( AST , S2  );
}ACCESS_S2_FIELD;
typedef struct {
	/*    get method */
	FLOAT  (*get)( AST );
	/*    set method */
	FLOAT  (*set)( AST , FLOAT  );
}ACCESS_FLOAT_FIELD;
typedef struct {
	/*    get method */
	DOUBLE  (*get)( AST );
	/*    set method */
	DOUBLE  (*set)( AST , DOUBLE  );
}ACCESS_DOUBLE_FIELD;
typedef struct {
	/*    get method */
	LDOUBLE  (*get)( AST );
	/*    set method */
	LDOUBLE  (*set)( AST , LDOUBLE  );
}ACCESS_LDOUBLE_FIELD;
typedef struct {
	/*    get method */
	S8  (*get)( AST );
	/*    set method */
	S8  (*set)( AST , S8  );
}ACCESS_S8_FIELD;
typedef struct {
	/*    get method */
	U8  (*get)( AST );
	/*    set method */
	U8  (*set)( AST , U8  );
}ACCESS_U8_FIELD;
/*********************************************************************
**********************************************************************
*********************************************************************/
/* エラーコード */
#define ALLOC_NEWMEMORY   0x0101
#define ALLOC_REALLOCMEMORY   0x0102
#define ALLOC_FREEMEMORY  0x0103

#define ALLOC_OVERFLOW   0x0108
#define ALLOC_BUFFER_TOOLONG   0x0109
#define ALLOC_UNDERFLOW     0x010A

#define ALLOC_SWAPOUT_DATALOST  0x0110


#define INDEX_TOOLARGER  0x0201

#define DATA_SETTING_MISS  0x0301

#include "rbtree.h"


#include "table_MemoryDebugInfo.h"

typedef struct __MEMORY_ERROR_INFO{
	TABLEMANAGER*  mnger;
	U2   lineno;
	U2   errCode;
	AST  astMax;
	AST  astIdx;
}MEMORY_ERROR_INFO;
#define Throw_MemoryError( name, code, max, idx )  stErrorCode.mnger=name;stErrorCode.lineno=__LINE__;\
	stErrorCode.errCode=code;stErrorCode.astMax=max;stErrorCode.astIdx=idx;ReceiveError( stErrorCode )

#define TRY   if( COEXIT_FATAL != CatchMemError() ){
#define CATCH(result)  if( COEXIT_FATAL == CatchMemError() ){return (result);}}

extern MEMORY_ERROR_INFO   stErrorCode;
extern BOOL AllocBuffer_Com( TABLEMANAGER *bufMan, AST astReqArg , VOID (*resetListener)( U4  procid, U2 index ) );
extern BOOL AllocTable_Com( TABLEMANAGER *tableMan, AST astReqArg, VOID (*resetListener)( U4  procid, U2 index ) );
extern BOOL Clear_Com( TABLEMANAGER *man );
extern BOOL Reset_Com( TABLEMANAGER *man );
extern VOID* Check_Com( TABLEMANAGER *man, VOID (*resetListener)( U4  procid, U2 index ), AST index );
extern BOOL Copy_Com( TABLEMANAGER *man, VOID (*resetListener)( U4  procid, U2 index ), AST  astOrg,  AST  astDst,  AST astLenth );
extern BOOL Table_SwapIn( U2 kind, AST headerno );
extern VOID TblClear_Terminate( VOID );
extern VOID ReceiveError( MEMORY_ERROR_INFO stInfo );
extern S4   CatchMemError(VOID);
#endif /* TABLE_H_ */
